package com.heima.admin.aspect;

import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.Around;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Pointcut;
import org.aspectj.lang.reflect.MethodSignature;
import org.springframework.stereotype.Component;
import org.springframework.web.context.request.RequestContextHolder;
import org.springframework.web.context.request.ServletRequestAttributes;

import javax.servlet.http.HttpServletRequest;
import java.lang.reflect.Method;
import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;

/**
 * 切面类: 统一的处理业务日志
 * @作者 itcast
 * @创建日期 2021/2/4 15:39
 **/
@Aspect
@Component
public class SysLogAspect {
    // 当一个标记了SysLog注解的方法被调用以后
    // 这个切面的通知方法会被触发
    @Pointcut("@annotation(com.heima.admin.aspect.SysLog)")
    public void Pointcut(){
    }

    @Around("Pointcut()")
    public Object handleSysLog(ProceedingJoinPoint point) throws Throwable {// Method
        Object result=null;
        // 希望记录一条操作日志
        // 记录登录人   添加了一个敏感词
        // 登录人IP  请求方式  请求URI        类名 + 方法名称
        // 操作时间
        // 方法持续时间
        MethodSignature signature = (MethodSignature) point.getSignature();
        Method method = signature.getMethod();
        SysLog sysLog = method.getDeclaredAnnotation(SysLog.class);
        String value = sysLog.value();


        HttpServletRequest request = ((ServletRequestAttributes) RequestContextHolder.getRequestAttributes()).getRequest();


        //  方法执行前 增强操作
        long startTime = System.currentTimeMillis();
        result = point.proceed(); // 目标方法被调用了
        long endTime =System.currentTimeMillis();
        //  方法执行后 增强操作
        System.out.println(" ==============操作日志  start ===================  ");
        System.out.println("操作人: admin");
        System.out.println("登录人IP: "+ request.getRemoteAddr());
        System.out.println("请求方式: "+ request.getMethod());
        System.out.println("请求方式: "+ request.getRequestURI());
        System.out.println("具体操作: "+value);
        System.out.println("调用方法: "+method.getDeclaringClass().getName() +"."+method.getName());
        System.out.println("操作时间: "+ LocalDateTime.now().format(
                DateTimeFormatter.ofPattern("yyyy年MM月dd日 hh:mm:ss")));
        System.out.println("持续时间: "+ (endTime - startTime));
        // // 登录人IP  请求方式  请求URI
        System.out.println(" ==============操作日志  end =====================  ");
        return result;
    }



}
